PROGRAM Ejercicio_11_TP3;
USES
CRT;
TYPE
CAD40 = STRING[40];

REG_ARTICULO = RECORD {REGISTRO DE PRODUCTOS}
	       CODIGO : LONGINT; {Codigo del artículo}
	       DESCRIPCION : CAD40; {Descripción del producto}
	       PRECIO : REAL; {Precio del producto}
	       END;
V_ARTICULOS = ARRAY[1..100] OF REG_ARTICULO;

REG_ART_VENTA = RECORD {REGISTRO DE VENTAS DE PRODUCTOS}
	        CODIGO : LONGINT; {Codigo del artículo vendido}
	        CANTIDAD : INTEGER; {Cantidad de artículos vendidos}
	        END;
V_VENTAS = ARRAY[1..100] OF REG_ART_VENTA;

R_TABLA = RECORD {REGISTRO DE TABLA}
	  ESTADO : BOOLEAN; {Estado de venta en el día; TRUE = Tiene datos y se puede procesar; FALSE = No tiene datos, no es necesario procesar}
	  TAMANIO : BYTE; {**Tamaño de V_VENTAS**}
	  VENTA : V_VENTAS; {Venta diaria de artículos}
	  DIA : 0..31;
	  END;
TABLA = ARRAY[1..6,1..7] OF R_TABLA;

VAR
MENORES : V_VENTAS;
AUX : REG_ARTICULO;
LISTA_PRECIO : V_ARTICULOS;
MES : TABLA;
CANIO : INTEGER;
OPCION, N, I, J, K, ADIA, POSF, POSC, CMES, TMES, O, PDIA, ULTY, PRY, CEN : BYTE;
PINGRESO : BOOLEAN = FALSE;
SINGRESO : BOOLEAN = FALSE;
ENCONTRADO : BOOLEAN = FALSE;

{MÓDULOS}

PROCEDURE INGRESO_LISTA_PRECIOS;
BEGIN {MODULO INGRESO LISTA}
CLRSCR;
WRITELN('=============== * Ingreso lista de precios * ===============');
WRITELN;
WRITE('Ingrese la cantidad de productos a registrar: ');READLN(N);
WRITELN;
FOR I:= 1 TO N DO
		 BEGIN {CICLO PARA CARGAR LISTA PRECIOS}
		 WITH LISTA_PRECIO[I] DO BEGIN
				         WRITE('Ingrese el código: '); READLN(CODIGO);
					 WRITE('Ingrese la descripcion: ');READLN(DESCRIPCION);
					 WRITE('Ingrese el precio: $');READLN(PRECIO);
					 END;
		 END; {FIN CICLO PARA CARGAR LISTA PRECIOS}
FOR I := 1 TO N-1 DO {CICLO ORDENAMIENTO}
		    FOR J := I+1 TO N DO
		     		      IF LISTA_PRECIO[J].CODIGO < LISTA_PRECIO[I].CODIGO THEN BEGIN
		 		      				     			      AUX := LISTA_PRECIO[J];
		 		      				     			      LISTA_PRECIO[J] := LISTA_PRECIO[I];
		 		      				     			      LISTA_PRECIO[I] := AUX;
		 		      				     			      END; {FIN CICLO ORDENAMIENTO}
PINGRESO := TRUE;
END;{FIN MODULO INGRESO LISTA}

{**********************************INGRESO_TABLA_VETAS********************************
  Tenia pensado hacer que automaticamente busque el primer dia del mes a partir de la 
              fecha en la pc, pero creo que no vale la pena complicarse.              }

PROCEDURE INGRESO_TABLA_VETAS;
BEGIN
	CLRSCR;
	WRITE ('Ingrese el año (AAAA): ');READLN(CANIO);
	CLRSCR;
	WRITE ('Infrese el mes (MM): ');READLN (CMES);
	CLRSCR;
	WRITELN('Ingrese la opciòn correspondiete para indicar que dia fue el 1ro del mes corriente : ');
	WRITELN('1.Domingo');
	WRITELN('2.Lunes');
	WRITELN('3.Marter');
	WRITELN('4.Miercoles');
	WRITELN('5.Jueves');
	WRITELN('6.Viernes');
	WRITELN('7.Sabado');
	READLN(PDIA);
	CASE (CMES) OF 
						1,3,5,7,8,10,12: TMES := 31;
						4,6,9,11: TMES := 30;
						2: IF (CANIO MOD 400 = 0) THEN TMES := 29 else TMES := 28; 
					END;			
	MES[1,PDIA].DIA := 0;
	FOR I:=1 TO 6 DO {recorre las filas}
		FOR J:=1 TO 7 DO{recorre las columnas}
			IF ((I=1) AND (J<PDIA)) OR (MES[I,J].DIA=TMES) THEN {descarta los primeros y ultimos espacios del calendario}
			    MES[I,J].ESTADO := FALSE
					ELSE { Ingresa los datos de cada dia }
						WITH MES[I,J] DO 
						BEGIN
						DIA := DIA+1;
						ESTADO := TRUE;
						WRITELN('Inserte cantidad de productos distintos vendidos el dia ',DIA,': ');READLN(TAMANIO);
						FOR K:=1 TO TAMANIO DO { Ingresa la lista de ventas diarias }
							WITH VENTA[K] DO 
								BEGIN
									WRITELN('Ingrese el codigo del articulo : '); READLN(CODIGO);
									WRITELN('Ingrese la cantidad vendida del articulo ',CODIGO,' : ');READLN(CANTIDAD)
							  END
					  END;
					  
SINGRESO := TRUE;	
END;
{***********************************INGRESO_TABLA_VETAS********************************}

{***********************************ARTICULO_MENOS_VENDIDO*****************************}
PROCEDURE ARTICULO_MENOS_VENDIDO;
BEGIN
	CLRSCR;
	WRITELN('De que dia desea ver el/los articulo/s menos vendido/s : ');READLN(ADIA);
  POSF := ((ADIA+PDIA) DIV 7)+1;
  POSC := ((ADIA+PDIA) MOD 7);
  {Inicializo las variables para buscar el/los menor/es}
		MENORES[1] := MES[POSF,POSC].VENTA[1];	
		O := 1; {tamaño de menores}		
		FOR I:=2 TO MES[POSF,POSC].TAMANIO DO
			BEGIN
				{Busco el menor e inserto en el vector menores.}
				IF (MENORES[O].CANTIDAD > MES[POSF,POSC].VENTA[I].CANTIDAD) THEN
					BEGIN
						O := 1;
						MENORES[O] := MES[POSF,POSC].VENTA[I];
					END ELSE IF (MENORES[O].CANTIDAD = MES[POSF,POSC].VENTA[I].CANTIDAD) THEN
						BEGIN							 
							O:=O+1;
							MENORES[O] := MES[POSF,POSC].VENTA[I];
						END;			
			END;
			{MOSTRAR}
			FOR I:=1 TO O DO
			{ BUSKEDA BIN}
			PRY := 1;
			ULTY := N; 
			WHILE (PRY <= ULTY) AND (ENCONTRADO = FALSE) DO
             BEGIN 
               CEN := (PRY+ULTY) DIV 2; 
               IF (MENORES[I].CODIGO = LISTA_PRECIO[CEN].CODIGO) THEN 
               	BEGIN
                   ENCONTRADO := TRUE;
                   WRITELN(LISTA_PRECIO[CEN].CODIGO,' | ',LISTA_PRECIO[CEN].DESCRIPCION,' | ',LISTA_PRECIO[CEN].PRECIO,' (U) | ',MENORES[I].CANTIDAD)
                 END
               ELSE IF (MENORES[I].CODIGO > LISTA_PRECIO[CEN].CODIGO) THEN 
                       PRY := CEN+1
                    ELSE 
                        ULTY := CEN-1; 
            END;

			{ MOSTRAR CON BUSQUEDA SECUENCIAL
			FOR I:=1 TO O DO
		  	FOR J:=1 TO N DO
			   IF (MENORES[I].CODIGO = LISTA_PRECIO[J].CODIGO) THEN
			     WRITELN(LISTA_PRECIO[J].CODIGO,' | ',LISTA_PRECIO[J].DESCRIPCION,' | ',LISTA_PRECIO[J].PRECIO,' (U) | ',MENORES[I].CANTIDAD);}
			
  
END;
{***********************************ARTICULO_MENOS_VENDIDO*****************************}


{FIN MÓDULOS}

BEGIN {PRINCIPAL}
REPEAT {REPEAT MENU PRINCIPAL}
	      CLRSCR;
	      WRITELN('(BETA1 xD)');
	      WRITELN;
	      WRITELN('============== MENU PRINCIPAL ==============');
	      WRITELN;
	      WRITELN('1 - Ingresar la lista de precios');
	      WRITELN('2 - Ingresar tabla de ventas');
	      WRITELN('3 - Conocer día con mayor venta y día con menor venta');
	      WRITELN('4 - Conocer semana con mayor venta e identificar artículo mas vendido');
	      WRITELN('5 - Identificar artículo menos vendido (ingresando día de la semana)');
	      WRITELN('0 - Salir del programa');
	      WRITELN;
	      WRITE('Ingrese una opcion: ');READLN(OPCION);
	      CASE OPCION OF {CASE de opciones de menú}
	      	    5 : IF (PINGRESO) THEN IF (SINGRESO) THEN ARTICULO_MENOS_VENDIDO ELSE BEGIN WRITE('Primero ingrese la lista de ventas del mes.');READLN END ELSE BEGIN WRITE('Primero ingrese la lista de precios.');READLN END;
	      	    2 : IF (PINGRESO) THEN INGRESO_TABLA_VETAS ELSE BEGIN WRITE('Primero ingrese la lista de precios');READLN END;
	      			1 : INGRESO_LISTA_PRECIOS;
	      			0 : BEGIN WRITELN; WRITELN('******************** FIN DEL PROGRAMA ********************'); WRITELN; READKEY; END;
	      			ELSE BEGIN {Salida ELSE de CASE}
	      			     WRITELN;
	      			     WRITELN('La opcion ingresada no es válida, verifique e intente nuevamente');
	      			     WRITELN('Presione una tecla para continuar'); READKEY;
	      			     END;{FIN Salida ELSE de CASE}
	      END;{Fin CASE de opciones de menú}
UNTIL OPCION = 0; {FIN REPEAT MENU PRINCIPAL}
END. {FIN PRINCIPAL}
